package com.blog.cmrpersonalblog.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.time.LocalDateTime;

/**
 * 消息通知实体类
 */
@Data
@TableName("notification")
public class Notification {

    /**
     * 通知ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 接收通知的用户ID
     */
    @TableField("user_id")
    private Long userId;

    /**
     * 发送通知的用户ID（系统通知时为NULL）
     */
    @TableField("sender_id")
    private Long senderId;

    /**
     * 发送者数量（聚合通知，默认1）
     * 用于点赞通知聚合：如"张三、李四等15人赞了你的文章"
     */
    @TableField("sender_count")
    private Integer senderCount;

    /**
     * 发送者ID列表（JSON数组，最多保存前100个）
     * 用于展示"张三、李四、王五等N人"
     * 格式：[1001, 1002, 1003, ...]
     */
    @TableField("sender_ids")
    private String senderIds;

    /**
     * 最新发送者ID（用于展示最新操作者）
     * 聚合通知中，显示最后一个操作的用户
     */
    @TableField("last_sender_id")
    private Long lastSenderId;

    /**
     * 最后更新时间（聚合通知每次更新时记录）
     * 用于排序和展示"最新更新时间"
     */
    @TableField("last_update_time")
    private LocalDateTime lastUpdateTime;

    /**
     * 通知类型
     * FOLLOW-新增粉丝
     * LIKE-点赞
     * COLLECT-收藏
     * COMMENT-评论
     * REPLY-回复
     * SYSTEM-系统通知
     */
    @TableField("type")
    private String type;

    /**
     * 通知标题
     */
    @TableField("title")
    private String title;

    /**
     * 通知内容
     */
    @TableField("content")
    private String content;

    /**
     * 目标类型：article-文章, comment-评论, user-用户
     */
    @TableField("target_type")
    private String targetType;

    /**
     * 目标ID（文章ID、评论ID、用户ID等）
     */
    @TableField("target_id")
    private Long targetId;

    /**
     * 额外数据（JSON格式）
     */
    @TableField("extra_data")
    private String extraData;

    /**
     * 是否已读 0-未读 1-已读
     */
    @TableField("is_read")
    private Integer isRead;

    /**
     * 阅读时间
     */
    @TableField("read_time")
    private LocalDateTime readTime;

    /**
     * 状态 0-已删除 1-正常
     */
    @TableField("status")
    private Integer status;

    /**
     * 创建时间
     */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    /**
     * 通知类型常量
     */
    public static final String TYPE_FOLLOW = "FOLLOW";
    public static final String TYPE_LIKE = "LIKE";
    public static final String TYPE_COLLECT = "COLLECT";
    public static final String TYPE_COMMENT = "COMMENT";
    public static final String TYPE_REPLY = "REPLY";
    public static final String TYPE_MENTION = "MENTION";
    public static final String TYPE_SYSTEM = "SYSTEM";

    /**
     * 目标类型常量
     */
    public static final String TARGET_TYPE_ARTICLE = "article";
    public static final String TARGET_TYPE_COMMENT = "comment";
    public static final String TARGET_TYPE_USER = "user";

    /**
     * 状态常量
     */
    public static final int STATUS_DELETED = 0;
    public static final int STATUS_NORMAL = 1;

    /**
     * 已读状态常量
     */
    public static final int READ_STATUS_UNREAD = 0;
    public static final int READ_STATUS_READ = 1;

    /**
     * 判断是否已读
     */
    public boolean isRead() {
        return isRead != null && isRead == READ_STATUS_READ;
    }

    /**
     * 判断是否未读
     */
    public boolean isUnread() {
        return isRead == null || isRead == READ_STATUS_UNREAD;
    }

    /**
     * 判断是否正常状态
     */
    public boolean isNormal() {
        return status != null && status == STATUS_NORMAL;
    }

    /**
     * 判断是否已删除
     */
    public boolean isDeleted() {
        return status != null && status == STATUS_DELETED;
    }

    /**
     * 判断是否系统通知
     */
    public boolean isSystemNotification() {
        return TYPE_SYSTEM.equals(type);
    }

    /**
     * 判断是否用户通知
     */
    public boolean isUserNotification() {
        return senderId != null && !isSystemNotification();
    }
}

